package com.liug.droidsmall2.study.designmode;

import java.io.Serializable;

/**
 * 单例模式
 * 1.每次从getInstance()都能返回一个且唯一的一个对象。
 * 2.资源共享情况下，getInstance()必须适应多线程并发访问。
 * 3.提高访问性能。
 * 4.懒加载（Lazy Load），在需要的时候才被构造。
 */

public class SingletonMode {

    /**
     * 单例模式 懒汉式   缺点：不适应多线程并发访问。
     */
    public static class SingletonModeA {
        private static SingletonMode instance;

        public static SingletonMode getInstance() {
            if (instance == null) {
                instance = new SingletonMode();
            }
            return instance;
        }
    }


    /***
     * 单例模式 懒汉式   缺点：加锁性能瓶颈 耗时大
     */
    public static class SingletonModeB {
        private static SingletonModeB instance;

        public static synchronized SingletonModeB getInstance() {
            if (instance == null) {
                instance = new SingletonModeB();
            }
            return instance;
        }
    }


    /**
     * 单例模式 饿汉式   缺点：不能带参数
     */

    public static class SingletonModeC {
        private static SingletonModeC instance = new SingletonModeC();

        public static SingletonModeC getInstance() {
            return instance;
        }
    }


    /**
     * 单例模式 懒汉式的  优点：同时读取实例的时候不会进行同步，没有性能缺陷；也不依赖JDK版本。
     */

    public static class SingletonModeD implements Serializable {

        private static class SingletonHoulder {
            static final SingletonModeD sinletonMode = new SingletonModeD();
        }

        public static SingletonModeD getInstance() {
            return SingletonHoulder.sinletonMode;
        }

        // private的构造函数用于避免外界直接使用new来实例化对象
        private SingletonModeD() {
        }

        //readResolve方法应对单例对象被序列化时候
        public Object readResolve() {
            return getInstance();
        }

    }

}


